home *** CD-ROM | disk | FTP | other *** search
/ Java Programmer's Toolkit / Java Programmer's Toolkit.iso / gs3.53 / gs_init.ps < prev    next >
Text File  |  1996-01-10  |  39KB  |  1,250 lines

  1. %    Copyright (C) 1989, 1995 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % Initialization file for the interpreter.
  16. % When this is run, systemdict is still writable.
  17.  
  18. % Comment lines of the form
  19. %    %% Replace <n> <file(s)>
  20. % indicate places where the next <n> lines should be replaced by
  21. % the contents of <file(s)>, when creating a single merged init file.
  22.  
  23. % The interpreter can call out to PostScript code.  All procedures
  24. % called in this way, and no other procedures defined in these
  25. % initialization files, have names that begin with %, e.g.,
  26. % (%Type1BuildChar) cvn.
  27.  
  28. % Check the interpreter revision.  NOTE: the interpreter code requires
  29. % that the first non-comment token in this file be an integer.
  30. 353
  31. dup revision ne
  32.  { (gs: Interpreter revision \() print revision 10 string cvs print
  33.    (\) does not match gs_init.ps revision \() print 10 string cvs print
  34.    (\).\n) print flush null 1 .quit
  35.  }
  36. if pop
  37.  
  38. % Acquire userdict, and set its length if necessary.
  39. /userdict where
  40.  { pop userdict maxlength 0 eq }
  41.  { true }
  42. ifelse
  43.  {        % userdict wasn't already set up by iinit.c.
  44.    /userdict
  45.    currentdict dup 200 .setmaxlength        % userdict
  46.    systemdict begin def        % can't use 'put', userdict is local
  47.  }
  48.  { systemdict begin
  49.  }
  50. ifelse
  51.  
  52. % Define true and false.
  53. /true 0 0 eq def
  54. /false 0 1 eq def
  55.  
  56. % Define dummy local/global operators if needed.
  57. systemdict /.setglobal known
  58.  { true .setglobal
  59.  }
  60.  { /.setglobal { pop } bind def
  61.    /.currentglobal { false } bind def
  62.    /.gcheck { pop false } bind def
  63.  }
  64. ifelse
  65.  
  66. % Define .languagelevel if needed.
  67. systemdict /.languagelevel known not { /.languagelevel 1 def } if
  68.  
  69. % Optionally choose a default paper size other than U.S. letter.
  70. % (a4) /PAPERSIZE where { pop pop } { /PAPERSIZE exch def } ifelse
  71.  
  72. % Turn on array packing for the rest of initialization.
  73. true setpacking
  74.  
  75. % Define the old MS-DOS EOF character as a no-op.
  76. % This is a hack to get around the absurd habit of MS-DOS editors
  77. % of adding an EOF character at the end of the file.
  78. <1a> cvn { } def
  79.  
  80. % Acquire the debugging flags.
  81. currentdict /DEBUG known   /DEBUG exch def
  82.   /VMDEBUG
  83.     DEBUG {{print mark
  84.             systemdict /level2dict known
  85.          { .currentglobal dup false .setglobal vmstatus
  86.            true .setglobal vmstatus 3 -1 roll pop
  87.            6 -2 roll pop .setglobal
  88.          }
  89.          { vmstatus 3 -1 roll pop
  90.          }
  91.         ifelse usertime 16#fffff and counttomark
  92.           { ( ) print (           ) cvs print }
  93.         repeat pop
  94.         ( ) print systemdict length (    ) cvs print
  95.         ( <) print count (    ) cvs print (>\n) print flush
  96.       }}
  97.       {{pop
  98.       }}
  99.      ifelse
  100.   def
  101.  
  102. currentdict /DISKFONTS known   /DISKFONTS exch def
  103. currentdict /ESTACKPRINT known   /ESTACKPRINT exch def
  104. currentdict /FAKEFONTS known   /FAKEFONTS exch def
  105. currentdict /FIXEDMEDIA known   /FIXEDMEDIA exch def
  106. currentdict /FIXEDRESOLUTION known   /FIXEDRESOLUTION exch def
  107. currentdict /LOCALFONTS known   /LOCALFONTS exch def
  108. currentdict /NOBIND known   /NOBIND exch def
  109. /.bind /bind load def
  110. NOBIND { /bind { } def } if
  111. currentdict /NOCACHE known   /NOCACHE exch def
  112. currentdict /NOCIE known   /NOCIE exch def
  113. currentdict /NODISPLAY known   not /DISPLAYING exch def
  114. currentdict /NOFONTMAP known   /NOFONTMAP exch def
  115. currentdict /NOFONTPATH known   /NOFONTPATH exch def
  116. currentdict /NOGC known   /NOGC exch def
  117. currentdict /NOPAUSE known   /NOPAUSE exch def
  118. currentdict /NOPLATFONTS known   /NOPLATFONTS exch def
  119. currentdict /NOPROMPT known   /NOPROMPT exch def
  120. currentdict /ORIENT1 known   /ORIENT1 exch def
  121. currentdict /OSTACKPRINT known   /OSTACKPRINT exch def
  122. currentdict /OUTPUTFILE known    % obsolete
  123.  { /OutputFile /OUTPUTFILE load def
  124.    currentdict /OUTPUTFILE undef
  125.  } if
  126. currentdict /QUIET known   /QUIET exch def
  127. currentdict /SAFER known   /SAFER exch def
  128. currentdict /SHORTERRORS known   /SHORTERRORS exch def
  129. currentdict /WRITESYSTEMDICT known   /WRITESYSTEMDICT exch def
  130.  
  131. % Acquire environment variables.
  132. currentdict /DEVICE known not
  133.  { (GS_DEVICE) getenv { /DEVICE exch def } if } if
  134.  
  135. (START) VMDEBUG
  136.  
  137. % Open the standard files, so they will be open at the outermost save level.
  138. (%stdin) (r) file pop
  139. (%stdout) (w) file pop
  140. (%stderr) (w) file pop
  141.  
  142. % Define a procedure for skipping over an unneeded section of code.
  143. % This avoids allocating space for the skipped procedures.
  144. % We can't use readline, because that imposes a line length limit.
  145. /.skipeof    % <string> .skipeof -
  146.  { currentfile exch 1 exch //filterdict /SubFileDecode get exec
  147.    flushfile
  148.  } bind def
  149.  
  150. % Define =string, which is used by some PostScript programs even though
  151. % it isn't documented anywhere.
  152. % Put it in userdict so that each context can have its own copy.
  153. userdict /=string 256 string put
  154.  
  155. % Print the greeting.
  156.  
  157. /printgreeting
  158.  { mark
  159.    product (Ghostscript) search
  160.     { pop pop pop
  161.       (This software comes with NO WARRANTY: see the file PUBLIC for details.\n)
  162.     }
  163.     { pop
  164.     }
  165.    ifelse
  166.    (\n) copyright
  167.    (\)\n) revisiondate 100 mod (-)
  168.    revisiondate 100 idiv 100 mod (-)
  169.    revisiondate 10000 idiv ( \()
  170.    revision 10 mod
  171.    revision 10 idiv 10 mod (.)
  172.    revision 100 idiv ( )
  173.    product
  174.    counttomark
  175.     { (%stdout) (w) file exch .writecvs
  176.     } repeat pop
  177.  } bind def
  178.  
  179. QUIET not { printgreeting flush } if
  180.  
  181. % Define a special version of def for making operator procedures.
  182. /odef
  183.     {1 index exch .makeoperator def} bind def
  184.  
  185. %**************** BACKWARD COMPATIBILITY
  186. /getdeviceprops
  187.  { null .getdeviceparams
  188.  } bind odef
  189. /.putdeviceprops
  190.  { null true counttomark 1 add 3 roll .putdeviceparams
  191.    dup type /booleantype ne
  192.     { dup mark eq { /unknown /rangecheck } if
  193.       counttomark 4 add 1 roll cleartomark pop pop pop
  194.       /.putdeviceprops load exch signalerror
  195.     }
  196.    if
  197.  } bind odef
  198. /.devicenamedict 1 dict dup /OutputDevice dup put def
  199. /.devicename
  200.  { //.devicenamedict .getdeviceparams exch pop exch pop
  201.  } bind odef
  202. /max { .max } bind def
  203. /min { .min } bind def
  204.  
  205. % Define predefined procedures substituting for operators,
  206. % in alphabetical order.
  207.  
  208. userdict /#copies 1 put
  209. /[    /mark load def
  210. /]     {counttomark array astore exch pop} odef
  211. /abs    {dup 0 lt {neg} if} odef
  212. % .beginpage is an operator in Level 2.
  213. /.beginpage { } odef
  214. /copypage
  215.     { 1 .endpage
  216.        { .currentnumcopies false .outputpage
  217.          (>>copypage, press <return> to continue<<\n) .confirm
  218.        }
  219.       if .beginpage
  220.     } odef
  221. % .currentnumcopies is redefined in Level 2.
  222. /.currentnumcopies { #copies } odef
  223. /setcolorscreen where { pop        % not in all Level 1 configurations
  224.    /currentcolorscreen
  225.     { .currenthalftone
  226.        { { 60 exch 0 exch 3 copy 6 copy }    % halftone - not possible
  227.          { 3 copy 6 copy }            % screen
  228.          { }                % colorscreen
  229.        }
  230.       exch get exec
  231.     } odef
  232. } if
  233. /currentscreen
  234.     { .currenthalftone
  235.        { { 60 exch 0 exch }            % halftone - not possible
  236.          { }                % screen
  237.          { 12 3 roll 9 { pop } repeat }    % colorscreen
  238.        }
  239.       exch get exec
  240.     } odef
  241. /.echo /echo load def
  242. userdict /.echo.mode true put
  243. /echo    {dup /.echo.mode exch store .echo} odef
  244. /eexec
  245.     { 55665 //filterdict /eexecDecode get exec
  246.       cvx systemdict begin stopped
  247.         % Only pop systemdict if it is still the top element,
  248.         % because this is apparently what Adobe interpreters do.
  249.       currentdict systemdict eq { end } if
  250.       { stop } if
  251.     } odef
  252. % .endpage is an operator in Level 2.
  253. /.endpage { 2 ne } odef
  254. % erasepage mustn't use gsave/grestore, because we call it before
  255. % the graphics state stack has been fully initialized.
  256. /erasepage
  257.     { /currentcolor where
  258.        { pop currentcolor currentcolorspace { setcolorspace setcolor } }
  259.        { /currentcmykcolor where
  260.           { pop currentcmykcolor { setcmykcolor } }
  261.           { currentrgbcolor { setrgbcolor } }
  262.          ifelse
  263.        }
  264.       ifelse 1 setgray .fillpage exec
  265.     } odef
  266. /executive
  267.     { { prompt
  268.          { (%statementedit) (r) file } stopped
  269.          { pop pop $error /errorname get /undefinedfilename eq
  270.         { exit } if        % EOF
  271.            handleerror null        % ioerror??
  272.          }
  273.         if
  274.         cvx execute
  275.       } loop
  276.     } odef
  277. /filter
  278.     { //filterdict 1 index .knownget
  279.        { exch pop exec }
  280.        { /filter load /undefined signalerror }
  281.       ifelse
  282.     } odef
  283. /handleerror
  284.     { errordict /handleerror get exec } bind def
  285. /identmatrix [1.0 0.0 0.0 1.0 0.0 0.0] readonly def
  286. /identmatrix
  287.     { //identmatrix exch copy } odef
  288. /initgraphics
  289.     { initmatrix newpath initclip
  290.       1 setlinewidth 0 setlinecap 0 setlinejoin
  291.       [] 0 setdash 0 setgray 10 setmiterlimit
  292.     } odef
  293. /languagelevel 1 def        % gs_lev2.ps may change this
  294. /makeimagedevice { false makewordimagedevice } odef
  295. /matrix    { 6 array identmatrix } odef
  296. /pathbbox { false .pathbbox } odef
  297. /prompt    { flush flushpage
  298.       (GS) print
  299.       count 0 ne { (<) print count =only } if
  300.       (>) print flush
  301.     } bind def
  302. /pstack    { 0 1 count 3 sub { index == } for } bind def
  303. /putdeviceprops
  304.     { .putdeviceprops { erasepage } if } odef
  305. /quit    { /quit load 0 .quit } odef
  306. /run    { dup type /filetype ne { (r) file } if cvx
  307.         % We must close the file when execution terminates,
  308.         % regardless of the state of the stack,
  309.         % and then propagate an error, if any.
  310.       cvx .runexec
  311.     } odef
  312. /setdevice
  313.     { .setdevice { erasepage } if } odef
  314. /showpage
  315.     { 0 .endpage
  316.        { .currentnumcopies true .outputpage
  317.          (>>showpage, press <return> to continue<<\n) .confirm
  318.          erasepage
  319.        }
  320.       if initgraphics .beginpage
  321.     } odef
  322. % Code output by Adobe Illustrator relies on the fact that
  323. % `stack' is a procedure, not an operator!!!
  324. /stack    { 0 1 count 3 sub { index = } for } bind def
  325. /start    { executive } def
  326. /stop    { true .stop } odef
  327. /stopped { false .stopped } odef
  328. /store    { 1 index where { 3 1 roll put } { def } ifelse } odef
  329. % When running in Level 1 mode, this interpreter is supposed to be
  330. % compatible with PostScript "version" 54.0 (I think).
  331. /version (54.0) def
  332.  
  333. % internaldict is defined in systemdict, but is allocated in local VM.
  334. systemdict /internaldict .knownget not { 0 } if type /operatortype ne
  335.  { .currentglobal false .setglobal
  336.    systemdict /internaldict known not { /internaldict 5 dict def } if
  337.    /internaldict
  338.     [ /dup load 1183615869 /eq load
  339.        [ /pop load internaldict ] cvx
  340.        [ /internaldict /cvx load /invalidaccess /signalerror cvx ] cvx
  341.       /ifelse load
  342.     ] cvx bind odef
  343.    .setglobal
  344.  } if
  345.  
  346. % Define some additional built-in procedures (beyond the ones defined by
  347. % the PostScript Language Reference Manual).
  348. % Warning: these are not guaranteed to stay the same from one release
  349. % to the next!
  350. /concatstrings
  351.     { exch dup length 2 index length add string    % str2 str1 new
  352.       dup dup 4 2 roll copy        % str2 new new new1
  353.       length 4 -1 roll putinterval
  354.     } bind def
  355. /copyarray
  356.     { dup length array copy } bind def
  357. /copystring
  358.     { dup length string copy } bind def
  359. /finddevice
  360.     { systemdict /devicedict get exch get
  361.     } bind def
  362. /.growdictlength    % get size for growing a dictionary
  363.     { length 3 mul 2 idiv 1 add
  364.     } bind def
  365. /.growdict        % grow a dictionary
  366.     { dup .growdictlength .setmaxlength
  367.     } bind def
  368. /.growput        % put, grow the dictionary if needed
  369.     { 2 index length 3 index maxlength eq
  370.        { 3 copy pop known not { 2 index .growdict } if
  371.        } if
  372.       put
  373.     } bind def
  374. /.packtomark
  375.     { counttomark packedarray exch pop } bind def
  376. /runlibfile
  377.     { findlibfile
  378.        { exch pop run }
  379.        { /undefinedfilename signalerror }
  380.       ifelse
  381.     } bind def
  382. /selectdevice
  383.     { finddevice setdevice .setdefaultscreen } bind def
  384. /signalerror        % <object> <errorname> signalerror -
  385.     { errordict exch get exec } bind def
  386.  
  387. % Define the =[only] procedures.  Also define =print,
  388. % which is used by some PostScript programs even though
  389. % it isn't documented anywhere.
  390. /write=only
  391.     { { .writecvs } null .stopped null ne
  392.        { pop (--nostringval--) writestring
  393.        }
  394.       if
  395.     } bind def
  396. /write=
  397.     { 1 index exch write=only (\n) writestring
  398.     } bind def
  399. /=only    { (%stdout) (w) file exch write=only } bind def
  400. /=    { =only (\n) print } bind def
  401. /=print    /=only load def
  402. % Temporarily define == as = for the sake of runlibfile0.
  403. /== /= load def
  404.  
  405. % Define procedures for getting and setting the current device resolution.
  406.  
  407. /gsgetdeviceprop    % <device> <propname> gsgetdeviceprop <value>
  408.  { 2 copy mark exch null .dicttomark .getdeviceparams
  409.    dup mark eq        % if true, not found
  410.     { pop dup /undefined signalerror }
  411.     { 5 1 roll pop pop pop pop }
  412.    ifelse
  413.  } bind def
  414. /gscurrentresolution    % - gscurrentresolution <[xres yres]>
  415.  { currentdevice /HWResolution gsgetdeviceprop
  416.  } bind def
  417. /gssetresolution    % <[xres yres]> gssetresolution -
  418.  { 2 array astore mark exch /HWResolution exch
  419.    currentdevice copydevice putdeviceprops setdevice
  420.  } bind def
  421.  
  422. % Define auxiliary procedures needed for the above.
  423. /shellarguments        % -> shell_arguments true (or) false
  424.     { /ARGUMENTS where
  425.        { /ARGUMENTS get dup type /arraytype eq
  426.           { aload pop /ARGUMENTS null store true }
  427.           { pop false }
  428.          ifelse }
  429.        { false } ifelse
  430.     } bind def
  431. /.confirm
  432.     { DISPLAYING NOPAUSE not and
  433.        {    % Print a message (unless NOPROMPT is true)
  434.         % and wait for the user to type something.
  435.         % If the user just types a newline, flush it.
  436.          NOPROMPT { pop } { print flush } ifelse
  437.          .echo.mode false echo
  438.          (%stdin) (r) file dup read
  439.           { dup (\n) 0 get eq { pop pop } { unread } ifelse }
  440.           { pop }
  441.          ifelse echo
  442.        }
  443.        { pop
  444.        }
  445.       ifelse
  446.     } bind def
  447.  
  448. % Define the procedure used by .runfile, .runstdin and .runstring
  449. % for executing user input.
  450. % This is called with a procedure or executable file on the operand stack.
  451. /execute
  452.     { stopped $error /newerror get and
  453.        { handleerror flush
  454.        } if
  455.     } odef
  456. % Define an execute analogue of runlibfile0.
  457. /execute0
  458.     { stopped $error /newerror get and
  459.        { handleerror flush /execute0 cvx 1 .quit
  460.        } if
  461.     } bind def
  462. % Define the procedure that the C code uses for running files
  463. % named on the command line.
  464. /.runfile { { runlibfile } execute } def
  465. % Define the procedure that the C code uses for running piped input.
  466. /.runstdin { (%stdin) (r) file cvx execute0 } bind def
  467. % Define the procedure that the C code uses for running commands
  468. % given on the command line with -c.
  469. /.runstring { cvx execute } def
  470.  
  471. % Define a special version of runlibfile that aborts on errors.
  472. /runlibfile0
  473.     { cvlit dup /.currentfilename exch def
  474.        { findlibfile not { stop } if }
  475.       stopped
  476.        { (Can't find \(or open\) initialization file ) print
  477.          .currentfilename == flush /runlibfile0 cvx 1 .quit
  478.        } if
  479.       exch pop cvx stopped
  480.        { (While reading ) print .currentfilename print (:\n) print flush
  481.          handleerror /runlibfile0 1 .quit
  482.        } if
  483.     } bind def
  484. % Temporarily substitute it for the real runlibfile.
  485. /.runlibfile /runlibfile load def
  486. /runlibfile /runlibfile0 load def
  487.  
  488. % Create the error handling machinery.
  489. % Define the standard error handlers.
  490. % The interpreter has created the ErrorNames array.
  491. /.unstoppederrorhandler    % <command> <errorname> .unstoppederrorhandler -
  492.  {    % This is the handler that gets used for recursive errors,
  493.     % or errors outside the scope of a 'stopped'.
  494.    2 copy SHORTERRORS
  495.     { (%%[ Error: ) print =only flush
  496.       (; OffendingCommand: ) print =only ( ]%%\n) print
  497.     }
  498.     { (Unrecoverable error: ) print =only flush
  499.       ( in ) print = flush
  500.       count 2 gt
  501.        { (Operand stack:\n  ) print
  502.      2 1 count 3 sub { (  ) print index =only flush } for
  503.      (\n) print flush
  504.        } if
  505.     }
  506.    ifelse
  507.    -1 0 1 //ErrorNames length 1 sub
  508.     { dup //ErrorNames exch get 3 index eq
  509.        { not exch pop exit } { pop } ifelse
  510.     }
  511.    for exch pop .quit
  512.  } bind def
  513. /.errorhandler        % <command> <errorname> .errorhandler -
  514.   {        % Detect an internal 'stopped'.
  515.     .instopped { null eq { pop pop stop } if } if
  516.     $error /.inerror get .instopped { pop } { pop true } ifelse
  517.      { .unstoppederrorhandler
  518.      } if    % detect error recursion
  519.     $error /globalmode .currentglobal false .setglobal put
  520.     $error /.inerror true put
  521.     $error /newerror true put
  522.     $error exch /errorname exch put
  523.     $error exch /command exch put
  524.     $error /recordstacks get $error /errorname get /VMerror ne and
  525.      {        % Attempt to store the stack contents atomically.
  526.        count array astore dup $error /ostack 4 -1 roll
  527.        countexecstack array execstack $error /estack 3 -1 roll
  528.        countdictstack array dictstack $error /dstack 3 -1 roll
  529.        put put put aload pop
  530.      }
  531.      { $error /dstack undef
  532.        $error /estack undef
  533.        $error /ostack undef
  534.      }
  535.     ifelse
  536.     $error /position currentfile status
  537.      { currentfile { fileposition } null .stopped null ne { pop null } if
  538.      }
  539.      { null
  540.      }
  541.     ifelse put
  542.         % During initialization, we don't reset the allocation
  543.         % mode on errors.
  544.     $error /globalmode get $error /.nosetlocal get and .setglobal
  545.     $error /.inerror false put
  546.     stop
  547.   } bind def
  548. % Define the standard handleerror.  We break out the printing procedure
  549. % (.printerror) so that it can be extended for binary output
  550. % if the Level 2 facilities are present.
  551.   /.printerror
  552.    { $error begin
  553.        /command load errorname SHORTERRORS
  554.     { (%%[ Error: ) print =only flush
  555.       (; OffendingCommand: ) print =only
  556.       currentdict /errorinfo .knownget
  557.        { (;\nErrorInfo:) print
  558.          dup type /arraytype eq
  559.           { { ( ) print =only } forall }
  560.           { ( ) print =only }
  561.          ifelse
  562.        } if
  563.           ( ]%%\n) print flush
  564.     }
  565.     { (Error: ) print ==only flush
  566.       ( in ) print ==only flush
  567.       currentdict /errorinfo .knownget
  568.        { (\nAdditional information: ) print ==only flush
  569.        } if
  570.       .printerror_long
  571.     }
  572.        ifelse
  573.        .clearerror
  574.      end
  575.      flush
  576.     } bind def     
  577.   /.printerror_long            % long error printout,
  578.                     % $error is on the dict stack
  579.    {    % Push the (anonymous) stack printing procedure.
  580.     %  <heading> <==flag> <override-name> <stackname> proc
  581.        {
  582.      currentdict exch .knownget    % stackname defined in $error?
  583.      {
  584.        4 1 roll            % stack: <stack> <head> <==flag> <over>
  585.        errordict exch .knownget    % overridename defined?
  586.        { 
  587.          exch pop exch pop exec    % call override with <stack>
  588.        }
  589.        { 
  590.          exch print exch        % print heading. stack <==flag> <stack>
  591.          1 index not { (\n) print } if
  592.          { 1 index { (\n    ) } { (   ) } ifelse print
  593.            dup type /dicttype eq
  594.            {
  595.          (--dict:) print
  596.          dup rcheck
  597.           { dup length =only (/) print maxlength =only }
  598.           { pop }
  599.          ifelse
  600.          (--) print
  601.            }
  602.            {
  603.          dup type /stringtype eq 2 index or
  604.          { ==only } { =only } ifelse
  605.            } ifelse
  606.          } forall
  607.          pop
  608.        }
  609.        ifelse            % overridden
  610.      }
  611.      { pop pop pop
  612.      }
  613.      ifelse                % stack known
  614.        }
  615.  
  616.        (\nOperand stack:) OSTACKPRINT /.printostack /ostack 4 index exec
  617.        (\nExecution stack:) ESTACKPRINT /.printestack /estack 4 index exec
  618.        (\nBacktrace:) true /.printbacktrace /backtrace 4 index exec
  619.        (\nDictionary stack:) false /.printdstack /dstack 4 index exec
  620.        (\n) print
  621.        pop    % printing procedure
  622.  
  623.        errorname /VMerror eq
  624.     { (VM status:) print mark vmstatus
  625.       counttomark { ( ) print counttomark -1 roll dup =only } repeat
  626.       cleartomark (\n) print
  627.     } if
  628.  
  629.        .languagelevel 2 ge
  630.     { (Current allocation mode is ) print
  631.       globalmode { (global\n) } { (local\n) } ifelse print
  632.     } if
  633.  
  634.        .oserrno dup 0 ne
  635.     { (Last OS error: ) print
  636.       errorname /VMerror ne
  637.        { dup .oserrorstring { = pop } { = } ifelse }
  638.        { = }
  639.       ifelse
  640.     }
  641.     { pop
  642.     }
  643.        ifelse
  644.  
  645.        position null ne
  646.     { (Current file position is ) print position = }
  647.        if
  648.  
  649.    } bind def
  650. % Define a procedure for clearing the error indication.
  651. /.clearerror
  652.  { $error /newerror false put
  653.    $error /errorinfo undef
  654.    0 .setoserrno
  655.  } bind def
  656.  
  657. % Define $error.  This must be in local VM.
  658. .currentglobal false .setglobal
  659. /$error 40 dict def        % newerror, errorname, command, errorinfo,
  660.                 % ostack, estack, dstack, recordstacks,
  661.                 % binary, globalmode,
  662.                 % .inerror, .nosetlocal, position,
  663.         % plus extra space for badly designed error handers.
  664. $error begin
  665.   /newerror false def
  666.   /recordstacks true def
  667.   /binary false def
  668.   /globalmode .currentglobal def
  669.   /.inerror false def
  670.   /.nosetlocal true def
  671.   /position null def
  672. end
  673. % Define errordict similarly.  It has one entry per error name,
  674. %   plus handleerror.
  675. /errordict ErrorNames length 1 add dict def
  676. .setglobal        % contents of errordict are global
  677. errordict begin
  678.   ErrorNames
  679.    { mark 1 index systemdict /.errorhandler get /exec load .packtomark cvx def
  680.    } forall
  681. % The handlers for interrupt and timeout are special; there is no
  682. % 'current object', so they push their own name.
  683.    { /interrupt /timeout }
  684.    { mark 1 index dup systemdict /.errorhandler get /exec load .packtomark cvx def
  685.    } forall
  686. /handleerror
  687.  { systemdict /.printerror get exec
  688.  } bind def
  689. end
  690.  
  691. % Define the [write]==[only] procedures.
  692. /.dict 26 dict dup
  693. begin def
  694.   /.cvp {1 index exch .writecvs} bind def
  695.   /.nop {exch pop .p} bind def
  696.   /.p {1 index exch writestring} bind def
  697.   /.p1 {2 index exch writestring} bind def
  698.   /.p2 {3 index exch writestring} bind def
  699.   /.print
  700.     { dup type .dict exch .knownget
  701.        { dup type /stringtype eq { .nop } { exec } ifelse }
  702.        { (-) .p1 type .cvp (-) .p }
  703.       ifelse
  704.     } bind def
  705.   /.pstring
  706.     {  { dup dup 32 lt exch 127 ge or
  707.           { (\\) .p1 2 copy -6 bitshift 48 add write
  708.         2 copy -3 bitshift 7 and 48 add write
  709.         7 and 48 add
  710.           }
  711.           { dup dup -2 and 40 eq exch 92 eq or {(\\) .p1} if
  712.           }
  713.          ifelse 1 index exch write
  714.        }
  715.       forall
  716.     } bind def  
  717.   /booleantype /.cvp load def
  718.   /conditiontype (-condition-) def
  719.   /devicetype (-device-) def
  720.   /dicttype (-dict-) def
  721.   /filetype (-file-) def
  722.   /fonttype (-fontID-) def
  723.   /gstatetype (-gstate-) def
  724.   /integertype /.cvp load def
  725.   /locktype (-lock-) def
  726.   /marktype (-mark-) def
  727.   /nulltype (null) def
  728.   /realtype /.cvp load def
  729.   /savetype (-save-) def
  730.   /nametype
  731.     {dup xcheck not {(/) .p1} if
  732.      1 index exch .writecvs} bind def
  733.   /arraytype
  734.     {dup rcheck
  735.       {() exch dup xcheck
  736.         {({) .p2
  737.          {exch .p1
  738.           1 index exch .print pop ( )} forall
  739.          (})}
  740.         {([) .p2
  741.          {exch .p1
  742.           1 index exch .print pop ( )} forall
  743.          (])}
  744.        ifelse exch pop .p}
  745.       {(-array-) .nop}
  746.      ifelse} bind def
  747.   /operatortype
  748.       {(--) .p1 .cvp (--) .p} bind def
  749.   /packedarraytype
  750.     { dup rcheck
  751.        { arraytype }
  752.        { (-packedarray-) .nop }
  753.       ifelse
  754.     } bind def
  755.   /stringtype
  756.     { dup rcheck
  757.        { (\() .p1 dup length 200 le
  758.           { .pstring }
  759.           { 0 200 getinterval .pstring (...) .p }
  760.          ifelse (\)) .p
  761.        }
  762.        { (-string-) .nop
  763.        }
  764.       ifelse
  765.     } bind def
  766. {//.dict begin .print pop end}
  767.   bind cvx
  768. end
  769.  
  770. /write==only exch def
  771. /write==
  772.     {1 index exch write==only (\n) writestring} bind def
  773. /==only    { (%stdout) (w) file exch write==only } bind def
  774. /==    {==only (\n) print} bind def
  775.  
  776. (END PROCS) VMDEBUG
  777.  
  778. % Define the font directory.
  779. % Make it big to leave room for transformed fonts.
  780. /FontDirectory false .setglobal 100 dict true .setglobal def
  781.  
  782. % Define the encoding dictionary.
  783. /EncodingDirectory 10 dict def    % enough for Level 2 + PDF standard encodings
  784.  
  785. % Define findencoding.  (This is redefined in Level 2.)
  786. /.findencoding
  787.  { //EncodingDirectory exch get exec
  788.  } bind def
  789. /.defineencoding
  790.  { //EncodingDirectory 3 1 roll put
  791.  } bind def
  792.  
  793. % Load StandardEncoding.
  794. %% Replace 1 (gs_std_e.ps)
  795. (gs_std_e.ps) dup runlibfile VMDEBUG
  796.  
  797. % Load ISOLatin1Encoding.
  798. %% Replace 1 (gs_iso_e.ps)
  799. (gs_iso_e.ps) dup runlibfile VMDEBUG
  800.  
  801. % Define stubs for the Symbol and Dingbats encodings.
  802. % Note that the first element of the procedure must be the file name,
  803. % since gs_lev2.ps extracts it to set up the Encoding resource category.
  804.  
  805.   /SymbolEncoding { /SymbolEncoding .findencoding } bind def
  806. %% Replace 3 (gs_sym_e.ps)
  807.   EncodingDirectory /SymbolEncoding
  808.    { (gs_sym_e.ps) systemdict begin runlibfile SymbolEncoding end }
  809.   bind put
  810.  
  811.   /DingbatsEncoding { /DingbatsEncoding .findencoding } bind def
  812. %% Replace 3 (gs_dbt_e.ps)
  813.   EncodingDirectory /DingbatsEncoding
  814.    { (gs_dbt_e.ps) systemdict begin runlibfile DingbatsEncoding end }
  815.   bind put
  816.  
  817. (END FONTDIR/ENCS) VMDEBUG
  818.  
  819. % Construct a dictionary of all available devices.
  820. mark
  821.     % Loop until the .getdevice gets a rangecheck.
  822.   errordict /rangecheck 2 copy get
  823.   errordict /rangecheck { pop stop } put    % pop the command
  824.   0 { {dup .getdevice exch 1 add} loop} stopped pop
  825.   dict /devicedict exch def
  826.   devicedict begin        % 2nd copy of count is on stack
  827.    { dup .devicename dup 3 -1 roll def
  828.      counttomark 1 roll
  829.    } repeat
  830.   end put
  831. counttomark packedarray /devicenames exch def pop
  832. .clearerror
  833.  
  834. % Determine the default device.
  835. /defaultdevice DISPLAYING
  836.  { systemdict /DEVICE .knownget
  837.     { devicedict exch .knownget not
  838.        { (Unknown device: ) print DEVICE =
  839.      flush /defaultdevice cvx 1 .quit
  840.        }
  841.       if
  842.     }
  843.     { 0 .getdevice
  844.     }
  845.    ifelse
  846.  }
  847.  { /nullpage finddevice
  848.  }
  849. ifelse def
  850.  
  851. (END DEVS) VMDEBUG
  852.  
  853. % Define statusdict, for the benefit of programs
  854. % that think they are running on a LaserWriter or similar printer.
  855. %% Replace 1 (gs_statd.ps)
  856. (gs_statd.ps) runlibfile
  857.  
  858. (END STATD) VMDEBUG
  859.  
  860. % Load the standard font environment.
  861. %% Replace 1 (gs_fonts.ps)
  862. (gs_fonts.ps) runlibfile
  863.  
  864. (END GS_FONTS) VMDEBUG
  865.  
  866. % Load the initialization files for optional features.
  867. %% Replace 4 INITFILES
  868. systemdict /INITFILES known
  869.  { INITFILES { dup runlibfile VMDEBUG } forall
  870.  }
  871. if
  872.  
  873. % If Level 2 functionality is implemented, enable it now.
  874. /.setlanguagelevel where
  875.  { pop 2 .setlanguagelevel
  876.  } if
  877.  
  878. % If the resource machinery was loaded, convert encodings to resources.
  879. /defineresource where
  880.  { pop EncodingDirectory
  881.     { dup length 256 eq
  882.        { /Encoding defineresource pop }
  883.        { pop pop }
  884.       ifelse
  885.     } forall
  886.  } if
  887.  
  888. (END INITFILES) VMDEBUG
  889.  
  890. % Create a null font.  This is the initial font.
  891. 8 dict dup begin
  892.   /FontMatrix [ 1 0 0 1 0 0 ] readonly def
  893.   /FontType 3 def
  894.   /FontName () def
  895.   /Encoding StandardEncoding def
  896.   /FontBBox { 0 0 0 0 } readonly def % executable is bogus, but customary ...
  897.   /BuildChar { pop pop 0 0 setcharwidth } bind def
  898.   /PaintType 0 def        % shouldn't be needed!
  899. end
  900. /NullFont exch definefont setfont
  901.  
  902. % Define NullFont as the font.
  903. /NullFont currentfont def
  904.  
  905. % Load initial fonts from FONTPATH directories, Fontmap file,
  906. % and/or .getccfont as appropriate.
  907. .loadinitialfonts
  908.  
  909. % Remove NullFont from FontDirectory, so it can't be accessed by mistake.
  910. FontDirectory /NullFont undef
  911.  
  912. (END FONTS) VMDEBUG
  913.  
  914. % Restore the real definition of runlibfile.
  915. /runlibfile /.runlibfile load def
  916. currentdict /.runlibfile undef
  917.  
  918. % Bind all the operators defined as procedures.
  919. /.bindoperators        % binds operators in currentdict
  920.  { % Temporarily disable the typecheck error.
  921.    errordict /typecheck 2 copy get
  922.    errordict /typecheck { pop } put    % pop the command
  923.    currentdict
  924.     { dup type /operatortype eq
  925.        { % This might be a real operator, so bind might cause a typecheck,
  926.      % but we've made the error a no-op temporarily.
  927.      .bind        % do a real bind even if NOBIND is set
  928.        }
  929.       if pop pop
  930.     } forall
  931.    put
  932.  } def
  933. NOBIND not { .bindoperators } if
  934.  
  935. % Establish a default environment.
  936.  
  937. DISPLAYING not { (%END DISPLAYING) .skipeof } if
  938. defaultdevice
  939. systemdict /DEVICEWIDTH known
  940. systemdict /DEVICEHEIGHT known or
  941. systemdict /DEVICEWIDTHPOINTS known or
  942. systemdict /DEVICEHEIGHTPOINTS known or
  943. systemdict /DEVICEXRESOLUTION known or
  944. systemdict /DEVICEYRESOLUTION known or
  945. systemdict /PAPERSIZE known or
  946. not { (%END DEVICE) .skipeof } if
  947. % Let DEVICEWIDTH and DEVICEHEIGHT override PAPERSIZE.
  948. systemdict /PAPERSIZE known
  949. systemdict /DEVICEWIDTH known not and
  950. systemdict /DEVICEHEIGHT known not and
  951.  {    % Convert the paper size to device dimensions.
  952.    true statusdict /.pagetypenames get
  953.     { PAPERSIZE eq
  954.        { PAPERSIZE load
  955.          dup 0 get /DEVICEWIDTHPOINTS exch def
  956.          1 get /DEVICEHEIGHTPOINTS exch def
  957.          pop false exit
  958.        }
  959.       if
  960.     }
  961.    forall
  962.     { (Unknown paper size: ) print PAPERSIZE ==only (.\n) print
  963.     }
  964.    if
  965.  }
  966. if
  967. % Adjust the device parameters per the command line.
  968. % It is possible to specify resolution, pixel size, and page size;
  969. % since any two of these determine the third, conflicts are possible.
  970. % We simply pass them to .setdeviceparams and let it sort things out.
  971.    mark /HWResolution null /HWSize null /PageSize null .dicttomark
  972.    .getdeviceparams .dicttomark begin
  973.    mark
  974.     % Check for resolution.
  975.    /DEVICEXRESOLUTION where dup
  976.     { exch pop HWResolution 0 DEVICEXRESOLUTION put }
  977.    if
  978.    /DEVICEYRESOLUTION where dup
  979.     { exch pop HWResolution 1 DEVICEYRESOLUTION put }
  980.    if
  981.    or { /HWResolution HWResolution } if
  982.     % Check for device sizes specified in pixels.
  983.    /DEVICEWIDTH where dup
  984.     { exch pop HWSize 0 DEVICEWIDTH put }
  985.    if
  986.    /DEVICEHEIGHT where dup
  987.     { exch pop HWSize 1 DEVICEHEIGHT put }
  988.    if
  989.    or { /HWSize HWSize } if
  990.     % Check for device sizes specified in points.
  991.    /DEVICEWIDTHPOINTS where dup
  992.     { exch pop PageSize 0 DEVICEWIDTHPOINTS put }
  993.    if
  994.    /DEVICEHEIGHTPOINTS where dup
  995.     { exch pop PageSize 1 DEVICEHEIGHTPOINTS put }
  996.    if
  997.    or { /PageSize PageSize } if
  998.     % Check whether any parameters were set.
  999.    dup mark eq { pop } { defaultdevice putdeviceprops } ifelse
  1000.    end
  1001. %END DEVICE
  1002. % Set any device properties defined on the command line.
  1003. dup getdeviceprops
  1004. counttomark 2 idiv
  1005.  { systemdict 2 index known
  1006.     { pop dup load counttomark 2 roll }
  1007.     { pop pop }
  1008.    ifelse
  1009.  } repeat
  1010. systemdict /BufferSpace known
  1011. systemdict /MaxBitmap known not and
  1012.  { /MaxBitmap BufferSpace
  1013.  } if
  1014. counttomark dup 0 ne
  1015.  { 2 add -1 roll putdeviceprops }
  1016.  { pop pop }
  1017. ifelse
  1018. setdevice        % does an erasepage
  1019. % If the media size is fixed, update the current page device dictionary.
  1020. FIXEDMEDIA not { (%END MEDIA) .skipeof } if
  1021. currentpagedevice dup length dict copy
  1022. dup /InputAttributes
  1023. 2 copy get dup length dict copy
  1024.     % Stack: <pagedevice> <pagedevice> /InputAttributes <inputattrs>
  1025. dup length dict copy dup
  1026. 0 2 copy get dup length dict copy
  1027.     % Stack: <pagedevice> <pagedevice> /InputAttributes
  1028.     %   <inputattrs> <inputattrs> 0 <attrs0>
  1029. dup /PageSize 7 index /PageSize get
  1030. put                % PageSize in 0
  1031. put                % 0 in InputAttributes
  1032. put                % InputAttributes in pagedevice
  1033. .setpagedevice        
  1034. %END MEDIA
  1035. %END DISPLAYING
  1036.  
  1037. (END DEVICE) VMDEBUG
  1038.  
  1039. % Establish a default upper limit in the character cache,
  1040. % namely, enough room for a 18-point character at the resolution
  1041. % of the default device, or for a character consuming 1% of the
  1042. % maximum cache size, whichever is larger.
  1043. mark
  1044.     % Compute limit based on character size.
  1045.   18 dup dtransform
  1046.   exch abs cvi 31 add 32 idiv 4 mul    % X raster
  1047.   exch abs cvi mul        % Y
  1048.     % Compute limit based on allocated space.
  1049.   cachestatus pop pop pop pop pop exch pop 0.01 mul cvi
  1050.   .max dup 10 idiv exch
  1051. setcacheparams
  1052. % Conditionally disable the character cache.
  1053. NOCACHE { 0 setcachelimit } if
  1054.  
  1055. (END CONFIG) VMDEBUG
  1056.  
  1057. % Establish an appropriate halftone screen.
  1058. % We make this a procedure so we can call it again when switching devices.
  1059.  
  1060. % Use an ordered dither for low-resolution devices.
  1061. /.setloresscreen    % <dpi> .setloresscreen -
  1062.  {    % The following 'ordered dither' spot function was contributed by
  1063.     % Gregg Townsend.  Thanks, Gregg!
  1064.    16.001 div 0            % not 16: avoids rounding problems
  1065.     { 1 add 7.9999 mul cvi exch 1 add 7.9999 mul cvi 16 mul add <
  1066.     0E 8E 2E AE 06 86 26 A6 0C 8C 2C AC 04 84 24 A4
  1067.     CE 4E EE 6E C6 46 E6 66 CC 4C EC 6C C4 44 E4 64
  1068.     3E BE 1E 9E 36 B6 16 96 3C BC 1C 9C 34 B4 14 94
  1069.     FE 7E DE 5E F6 76 D6 56 FC 7C DC 5C F4 74 D4 54
  1070.     01 81 21 A1 09 89 29 A9 03 83 23 A3 0B 8B 2B AB
  1071.     C1 41 E1 61 C9 49 E9 69 C3 43 E3 63 CB 4B EB 6B
  1072.     31 B1 11 91 39 B9 19 99 33 B3 13 93 3B BB 1B 9B
  1073.     F1 71 D1 51 F9 79 D9 59 F3 73 D3 53 FB 7B DB 5B
  1074.     0D 8D 2D AD 05 85 25 A5 0F 8F 2F AF 07 87 27 A7
  1075.     CD 4D ED 6D C5 45 E5 65 CF 4F EF 6F C7 47 E7 67
  1076.     3D BD 1D 9D 35 B5 15 95 3F BF 1F 9F 37 B7 17 97
  1077.     FD 7D DD 5D F5 75 D5 55 FF 7F DF 5F F7 77 D7 57
  1078.     02 82 22 A2 0A 8A 2A AA 00 80 20 A0 08 88 28 A8
  1079.     C2 42 E2 62 CA 4A EA 6A C0 40 E0 60 C8 48 E8 68
  1080.     32 B2 12 92 3A BA 1A 9A 30 B0 10 90 38 B8 18 98
  1081.     F2 72 D2 52 FA 7A DA 5A F0 70 D0 50 F8 78 D8 58
  1082.      > exch get 256 div
  1083.     }
  1084.    bind
  1085.         % Use correct, per-plane screens for CMYK devices only.
  1086.    systemdict /setcolorscreen known processcolors 4 eq and
  1087.     { 3 copy 6 copy setcolorscreen }
  1088.     { setscreen }
  1089.    ifelse
  1090.    0 array cvx settransfer    % Genoa CET won't accept a packed array!
  1091.    /setstrokeadjust where { pop true setstrokeadjust } if
  1092.  } bind def
  1093. % Use a 45-degree spot screen for high-resolution devices.
  1094. /.sethiresscreen    % <dpi> .sethiresscreen -
  1095.  {    % According to information published by Hewlett-Packard,
  1096.     % they use a 60 line screen on 300 DPI printers and
  1097.     % an 85 line screen on 600 DPI printers.
  1098.     % 46 was suggested as a good frequency value for printers
  1099.     % between 200 and 400 DPI, so we use it for lower resolutions.
  1100.    systemdict /DITHERPPI known
  1101.     { DITHERPPI }
  1102.     { dup cvi 100 idiv 6 .min {null 46 46 60 60 60 85} exch get }
  1103.    ifelse
  1104.    1 index 4.01 div .min    % at least a 4x4 cell
  1105.    45
  1106.     % The following screen algorithm is used by permission of the author.
  1107.     { 1 add 180 mul cos 1 0.08 add mul exch 2 add 180 mul cos 
  1108.       1 0.08 sub mul add 2 div % (C) 1989 Berthold K.P. Horn
  1109.     }
  1110.    bind
  1111.     % Ghostscript currently doesn't use correct, per-plane halftones
  1112.     % unless setcolorscreen has been executed.  Since these are
  1113.     % computationally much more expensive than binary halftones,
  1114.     % we check to make sure they are really warranted, i.e., we have
  1115.     % a high-resolution CMYK device (i.e., not a display) with
  1116.     % fewer than 5 bits per plane (i.e., not a true-color device).
  1117.    4 -1 roll 150 ge
  1118.     { /setcolorscreen where
  1119.        { pop defaultdevice getdeviceprops .dicttomark
  1120.          dup dup dup /RedValues known exch /GreenValues known and
  1121.        exch /BlueValues known and
  1122.       { dup dup /RedValues get 32 lt
  1123.           exch /GreenValues get 32 lt and
  1124.           exch /BlueValues get 32 lt and
  1125.          { 3 copy 6 copy
  1126.     % For really high-quality screening on printers, we need to
  1127.     % give each plane its own screen angle.  Unfortunately,
  1128.     % this currently has very large space and time costs.
  1129.     %**************** Uncomment the next line for high-quality screening.
  1130.         { 45 90 15 75 } { 3 1 roll exch pop 12 3 roll } forall
  1131.            setcolorscreen
  1132.          }
  1133.          { setscreen
  1134.          }
  1135.         ifelse
  1136.       }
  1137.       { pop setscreen
  1138.       }
  1139.      ifelse
  1140.        }
  1141.        { setscreen
  1142.        }
  1143.       ifelse
  1144.     }
  1145.     { setscreen
  1146.     }
  1147.    ifelse
  1148.     % Set the transfer function to lighten up the grays.
  1149.     % We correct at the high end so that very light grays
  1150.     % don't disappear completely if they darken <1 screen pixel.
  1151.     % Parameter values closer to 1 are better for devices with
  1152.     % less dot spreading; lower values are better with more spreading.
  1153.     % The value 0.8 is a compromise that will probably please no one!
  1154.     { 0.8 exp dup dup 0.9375 gt exch 0.999 lt and    % > 15/16
  1155.        { .currentscreenlevels 1 sub    % tweak to avoid boundary
  1156.      1 exch div 1 exch sub .min
  1157.        }
  1158.       if
  1159.     }
  1160.    settransfer
  1161.    /setstrokeadjust where { pop false setstrokeadjust } if
  1162.     % Increase fill adjustment so that we effectively use Adobe's
  1163.     % any-part-of-pixel rule.
  1164.    0.5 .setfilladjust
  1165.  } bind def
  1166. % Set the default screen based on the device resolution.
  1167. /.setdefaultscreen
  1168.  {    % Compute min(|dpi x|,|dpi y|) as the definition of the resolution.
  1169.    72 72 matrix defaultmatrix dtransform abs exch abs .min    %
  1170.    dup 150 lt systemdict /DITHERPPI known not and
  1171.     { .setloresscreen } { .sethiresscreen }
  1172.    ifelse
  1173.  } bind def
  1174. .setdefaultscreen
  1175. initgraphics
  1176. % The interpreter relies on there being at least 2 entries
  1177. % on the graphics stack.  Establish the second one now.
  1178. gsave
  1179.  
  1180. % Define some control sequences as no-ops.
  1181. % This is a hack to get around problems
  1182. % in some common PostScript-generating applications.
  1183. % Note that <04> and <1a> are self-delimiting characters, like [.
  1184. <04> cvn { } def        % Apple job separator
  1185. %<0404> cvn { } def        % two of the same
  1186. <1b> cvn { } def        % MS Windows LaserJet 4 prologue
  1187. %<041b> cvn { } def        % MS Windows LaserJet 4 epilogue
  1188. (\001M) cvn            % TBCP initiator
  1189.  { currentfile /TBCPDecode filter cvx exec
  1190.  } bind def
  1191. /@PJL                % H-P job control
  1192.  { currentfile //=string readline { pop } if
  1193.  } bind def
  1194.  
  1195. % If we want a "safer" system, disable some obvious ways to cause havoc.
  1196. SAFER not { (%END SAFER) .skipeof } if
  1197. /file
  1198.  { dup (r) eq 2 index (%pipe*) .stringmatch not and
  1199.     { file }
  1200.     { /invalidfileaccess signalerror }
  1201.    ifelse
  1202.  } bind odef
  1203. /renamefile { /invalidfileaccess signalerror } odef
  1204. /deletefile { /invalidfileaccess signalerror } odef
  1205. /putdeviceprops
  1206.  { counttomark
  1207.    dup 2 mod 0 eq { pop /rangecheck signalerror } if
  1208.    3 2 3 2 roll
  1209.     { dup index /OutputFile eq  
  1210.        { -2 roll 
  1211.          dup () ne { /putdeviceprops load /invalidfileaccess signalerror } if
  1212.          3 -1 roll
  1213.        }
  1214.        { pop
  1215.        }
  1216.       ifelse
  1217.     } for
  1218.    putdeviceprops
  1219.  } bind odef
  1220.  
  1221. %END SAFER
  1222.  
  1223. % Turn off array packing, since some PostScript code assumes that
  1224. % procedures are writable.
  1225. false setpacking
  1226.  
  1227. % Close up systemdict.
  1228. currentdict /.forceput undef        % remove temptation
  1229. currentdict /filterdict undef        % bound in where needed
  1230. end
  1231. WRITESYSTEMDICT not { systemdict readonly pop } if
  1232.  
  1233. (END INIT) VMDEBUG
  1234.  
  1235. % Establish local VM as the default.
  1236. false /setglobal where { pop setglobal } { .setglobal } ifelse
  1237. $error /.nosetlocal false put
  1238.  
  1239. % Clean up VM, and enable GC.
  1240. /vmreclaim where
  1241.  { pop NOGC not { 2 vmreclaim 0 vmreclaim } if
  1242.  } if
  1243.  
  1244. (END GC) VMDEBUG
  1245.  
  1246. % The interpreter will run the initial procedure (start).
  1247.